package common_middleware

import (
	"fmt"
	database_redis "jwt-demo/database/redis"
	jwt_util "jwt-demo/util"

	"github.com/gin-gonic/gin"
)

// 检查 Header 中是否带有合法的 token
// 如果没有，则拒绝访问
// 如果有，则刷新 redis 中 token 的过期时间
func AuthMiddleware(c *gin.Context) {
	fmt.Println("auth middleware, start")
	token := c.GetHeader("token")
	if token == "" {
		c.JSON(200, gin.H{
			"code":    2001,
			"message": "请求未携带token，无权限访问",
		})
		c.Abort()
		return
	}
	username := jwt_util.ParseToken(token)
	if username == "" {
		c.JSON(200, gin.H{
			"code":    2002,
			"message": "token 无效，无权限访问",
		})
		c.Abort()
		return
	}
	// 获取 redis 的值，验证 token 是否正确
	tokenInRedis := database_redis.GetKey(username)
	if tokenInRedis != token {
		// 验证不通过
		c.JSON(200, gin.H{
			"code":    2003,
			"message": "token 无效，无权限访问",
		})
		c.Abort()
		return
	}
	// 验证通过，更新 redis
	if !database_redis.SetKey(username, token, 60*60) {
		c.JSON(200, gin.H{
			"code":    2004,
			"message": "更新 token 失败",
		})
		c.Abort()
		return
	}
	c.Next()
	fmt.Println("auth middleware, end")
}
